package gui;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import utils.Comparador;
import utils.DownloadWSDL;
import utils.Parse;


public class main {
	private DownloadWSDL wsdlBaixado;
	private Comparador comparador;
	private Parse parseWSDL;
	private Parse parseXPEWS;
	private String pastaProjetoXpews;
	
	public main() {
		wsdlBaixado = new DownloadWSDL();
		comparador = null;
		parseWSDL = new Parse();
		parseXPEWS = new Parse();
	}
	
	/** Baixa todos os arquivos WSDL referenciados pelo arquivo XPEWS */
	private void baixar() throws ParserConfigurationException, SAXException, IOException{
		for(String url : comparador.listarLinksNsBehaviour()){
			wsdlBaixado.setUri(url);
			wsdlBaixado.baixar(pastaProjetoXpews);
		}
		
		for(String wsdl : wsdlBaixado.getWsdlsBaixados()){
			parseWSDL.setArquivoWSDL(wsdl);
			comparador.inserirWSDLNaHash(parseWSDL.getPortType());
		}
	}
	
	/** Baixa o arquivo WSDL de acordo com a Operation ou todas as Operations do NameSpace passado como parâmetro */
	private void baixar(String operationOuNs) throws ParserConfigurationException, SAXException, IOException{
		if(operationOuNs.startsWith("ns"))
			wsdlBaixado.setUri(comparador.getHstBehaviour().get(operationOuNs));
		else
			wsdlBaixado.setUri(comparador.retornarLinkPelaOperation(operationOuNs.trim()));
		
		wsdlBaixado.baixar(pastaProjetoXpews);
	}
	
	/** Compara todos as operations do arquivo XPEWS com todos os WSDL referenciados */
	public ArrayList<String> comparar() throws ParserConfigurationException, SAXException, IOException{
		this.baixar();
		
		return comparador.compararTodosEFormatar();
	}
	
	/** Compara a Operation ou todos as operations do NameSpace passadp como parâmetro com seu respectivo WSDL referenciado */
	public ArrayList<String> comparar(String operationOuNs) throws ParserConfigurationException, SAXException, IOException{
		if(operationOuNs.endsWith("OK") || operationOuNs.endsWith("NO"))
			operationOuNs = operationOuNs.substring(0, operationOuNs.length() - 5);
		
		this.baixar(operationOuNs);
		
		if(operationOuNs.startsWith("ns"))
			return comparador.compararPorNs(operationOuNs);
		else
			return comparador.comparar(operationOuNs);
	}
	
	public String getArquivo(){
		return parseXPEWS.getExtrator().getArquivoXML();
	}
	
	/** Abre o arquivo XPEWS  */
	public void setArquivo(String arquivo) throws ParserConfigurationException, SAXException, IOException{
		parseXPEWS.setArquivoXPEWS(arquivo);
		comparador = new Comparador();
		comparador.inserirXPEWSNaHash(parseXPEWS.getPewsOperations());
		comparador.inserirBehaviourNaHash(parseXPEWS.getBehaviour());
	}

	public DownloadWSDL getWsdlBaixado() {
		return wsdlBaixado;
	}

	public void setWsdlBaixado(DownloadWSDL wsdlBaixado) {
		this.wsdlBaixado = wsdlBaixado;
	}

	public Comparador getComparador() {
		return comparador;
	}

	public void setComparador(Comparador comparador) {
		this.comparador = comparador;
	}

	public Parse getParseWSDL() {
		return parseWSDL;
	}

	public void setParseWSDL(Parse parseWSDL) {
		this.parseWSDL = parseWSDL;
	}

	public Parse getParseXPEWS() {
		return parseXPEWS;
	}

	public void setParseXPEWS(Parse parseXPEWS) {
		this.parseXPEWS = parseXPEWS;
	}

	public String getPastaProjetoXpews() {
		return pastaProjetoXpews;
	}

	public void setPastaProjetoXpews(String pastaProjetoXpews) {
		this.pastaProjetoXpews = pastaProjetoXpews;
	}
}
